package com.ruoyi.common.utils;

import com.github.pagehelper.PageHelper;
import com.ruoyi.common.core.page.PageDomain;
import com.ruoyi.common.core.page.TableSupport;
/**
 * Firebird 兼容版分页工具类
 * 解决列名大小写敏感问题和 PageHelper 拼接排序问题
 *
 * @author wuxiao
 */
public class PageUtils extends PageHelper {

    /**
     * 设置请求分页数据（Firebird 兼容版）
     */
    public static void startPage() {
        PageDomain pageDomain = TableSupport.buildPageRequest();
        Integer pageNum = pageDomain.getPageNum();
        Integer pageSize = pageDomain.getPageSize();
        Boolean reasonable = pageDomain.getReasonable();

        String orderBy = pageDomain.getOrderBy();
        if (orderBy != null && !orderBy.isEmpty()) {
            // 1. 转义排序字段，防止 SQL 注入
            orderBy = escapeOrderBySql(orderBy);

            // 2. Firebird 兼容：只给列名加双引号，不包排序关键字
            // 正则匹配列名（字母、数字、下划线），后面可能跟空格和 ASC/DESC
            String[] parts = orderBy.split(",");
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < parts.length; i++) {
                String part = parts[i].trim();
                if (part.isEmpty()) continue;

                // 拆分列名和排序方式
                String[] colSort = part.split("\\s+");
                String colName = colSort[0];
                String sort = colSort.length > 1 ? colSort[1] : "";

                // 给列名加双引号
                sb.append("\"").append(colName).append("\"");
                if (!sort.isEmpty()) {
                    sb.append(" ").append(sort.toUpperCase()); // ASC/DESC
                }
                if (i < parts.length - 1) {
                    sb.append(", ");
                }
            }
            orderBy = sb.toString();
        }

        // 启动 PageHelper 分页
        PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable);
    }

    /**
     * 清理分页的线程变量
     */
    public static void clearPage() {
        PageHelper.clearPage();
    }

    /**
     * 简单转义排序字段，防止 SQL 注入
     */
    private static String escapeOrderBySql(String sql) {
        // 仅保留字母、数字、下划线、空格、逗号
        return sql.replaceAll("[^a-zA-Z0-9_,\\s]", "");
    }
}

